/*************************************************
  * 描述：树节点数据容器，包含文本、可编辑标志、tooltip、checkbox、用于 MzComboTree 的 showInCombo 标志、用户自定义 QVariant payload 等。
  *
  * File：cxitreenode.h
  * Author：chenyujin@mozihealthcare.cn
  * Date：2025/10/9
  * Update：
  * ************************************************/
#ifndef COREXI_COMMON_PC_CXITREENODE_H
#define COREXI_COMMON_PC_CXITREENODE_H

#include <QVariant>
#include <memory>

class CxiTreeNode : public std::enable_shared_from_this<CxiTreeNode>
{
	friend class CxiTreeModel;

public:
	using Ptr = std::shared_ptr<CxiTreeNode>;

public:
	explicit CxiTreeNode(Ptr parent = nullptr);
	~CxiTreeNode();

	// data处理
	/**
	 * 获取key值
	 * @return
	 */
	QString key() const;

	/**
	 * 设置key值
	 * @param k
	 */
	void setKey(const QString& k);

	/**
	 * 获取展示值
	 * @return
	 */
	QString text() const;

	/**
	 * 设置展示值
	 * @param t
	 */
	void setText(const QString& t);

	/**
	 * 获取鼠标悬停提示文本值
	 * @return
	 */
	QString tooltip() const;

	/**
	 * 获取鼠标悬停提示文本值
	 * @param t
	 */
	void setTooltip(const QString& t);

	/**
	 * 获取是否可编辑
	 * @return
	 */
	bool isEditable() const;

	/**
	 * 设置是否可编辑
	 * @param e
	 */
	void setEditable(bool e);

	/**
	 * 获取是否可勾选
	 * @return
	 */
	bool checkable() const;

	/**
	 * 设置是否可勾选
	 * @param c
	 */
	void setCheckable(bool c);

	/**
	 * 获取是否已勾选
	 * @return
	 */
	Qt::CheckState checkState() const;

	/**
	 * 设置是否已勾选
	 * @param s
	 */
	void setCheckState(Qt::CheckState s);

	// for MzComboTree: whether this node should appear in dropdown text when checked
	/**
	 * 是否在下拉中显示
	 * @return
	 */
	bool showInCombo() const;

	/**
	 * 设置是否在下拉中显示
	 * @param v
	 */
	void setShowInCombo(bool v);

	/**
	 * 获取实际数据
	 * @return
	 */
	QVariant value() const;

	/**
	 * 设置实际数据
	 * @param v
	 */
	void setValue(const QVariant& v);

private:// 私有化增删改查节点，只能通过model进行修改：model维护树形结构，node也存在相同数据结构，防止重复操作
	// 获取行号(本节点位于父节点第几个)
	int row();

	// 增
	/**
	 * 末尾追加子节点
	 * @param child
	 */
	void appendChild(Ptr child);

	/**
	 * 插入子节点
	 * @param row
	 * @param child
	 */
	void insertChild(int row, Ptr child);

	// 删
	/**
	 * 删除子节点
	 * @param row
	 */
	void removeChild(int row);

	// 查
	/**
	 * 获取子节点
	 * @param row
	 * @return
	 */
	Ptr child(int row);

	/**
	 * 递归查找
	 * @param key
	 * @param text
	 * @return
	 */
	Ptr getChild(const QString& key, const QString& text);

	/**
	 * 递归查找
	 * @param key
	 * @return
	 */
	Ptr getChildByKey(const QString& key);

	/**
	 * 递归查找
	 * @param key
	 * @return
	 */
	std::vector<Ptr> getChildrenByKey(const QString& key);

	/**
	 * 递归查找
	 * @param text
	 * @return
	 */
	Ptr getChildByText(const QString& text);

	/**
	 * 递归查找
	 * @param text
	 * @return
	 */
	std::vector<Ptr> getChildrenByText(const QString& text);

	/**
	 * 获取子节点个数（第一层级）
	 * @return
	 */
	int childCount() const;

	// int row() const;

	/**
	 * 获取父节点
	 * @return
	 */
	Ptr parent() const;

private:
	class CxiTreeNodePrivate;
	std::unique_ptr<CxiTreeNodePrivate> m_pImplNode;
};

#endif//COREXI_COMMON_PC_CXITREENODE_H
